package net.jgrm.redisadvanced.service;

import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;

/**
 * Redis Hash类型操作服务接口
 */
public interface RedisHashService {

    /**
     * 设置哈希表中的字段值
     *
     * @param key     键
     * @param hashKey 哈希键
     * @param value   值
     */
    void put(String key, String hashKey, Object value);

    /**
     * 设置哈希表中的多个字段值
     *
     * @param key 键
     * @param map 哈希键值对
     */
    void putAll(String key, Map<String, Object> map);

    /**
     * 获取哈希表中指定字段的值
     *
     * @param key     键
     * @param hashKey 哈希键
     * @param clazz   返回值类型
     * @param <T>     返回值泛型
     * @return 值
     */
    <T> T get(String key, String hashKey, Class<T> clazz);

    /**
     * 获取哈希表中所有字段的值
     *
     * @param key   键
     * @param clazz 返回值类型
     * @param <T>   返回值泛型
     * @return 哈希键值对
     */
    <T> Map<String, T> getAll(String key, Class<T> clazz);

    /**
     * 获取哈希表中多个指定字段的值
     *
     * @param key      键
     * @param hashKeys 哈希键数组
     * @param clazz    返回值类型
     * @param <T>      返回值泛型
     * @return 哈希键值对
     */
    <T> Map<String, T> multiGet(String key, String[] hashKeys, Class<T> clazz);

    /**
     * 判断哈希表中是否存在指定字段
     *
     * @param key     键
     * @param hashKey 哈希键
     * @return 是否存在
     */
    Boolean hasKey(String key, String hashKey);

    /**
     * 获取哈希表中所有字段的名称
     *
     * @param key 键
     * @return 字段名称集合
     */
    Set<String> keys(String key);

    /**
     * 获取哈希表中所有字段的值
     *
     * @param key   键
     * @param clazz 返回值类型
     * @param <T>   返回值泛型
     * @return 值集合
     */
    <T> java.util.List<T> values(String key, Class<T> clazz);

    /**
     * 获取哈希表中字段的数量
     *
     * @param key 键
     * @return 字段数量
     */
    Long size(String key);

    /**
     * 删除哈希表中的一个或多个字段
     *
     * @param key      键
     * @param hashKeys 哈希键数组
     * @return 删除的字段数量
     */
    Long delete(String key, Object... hashKeys);

    /**
     * 为哈希表中指定字段的整数值加上增量
     *
     * @param key     键
     * @param hashKey 哈希键
     * @param delta   增量
     * @return 增加后的值
     */
    Long increment(String key, String hashKey, long delta);

    /**
     * 为哈希表中指定字段的浮点数值加上增量
     *
     * @param key     键
     * @param hashKey 哈希键
     * @param delta   增量
     * @return 增加后的值
     */
    Double increment(String key, String hashKey, double delta);

    /**
     * 设置哈希表中的字段值，仅当字段不存在时才设置
     *
     * @param key     键
     * @param hashKey 哈希键
     * @param value   值
     * @return 设置是否成功
     */
    Boolean putIfAbsent(String key, String hashKey, Object value);

    /**
     * 为哈希表设置过期时间
     *
     * @param key        键
     * @param expireTime 过期时间
     * @param timeUnit   时间单位
     * @return 设置是否成功
     */
    Boolean expire(String key, long expireTime, TimeUnit timeUnit);
}